function fn1(){
    const promise = new Promise(function (resolve,reject){
        //...some code
        if(/* 异步操作成功 */ true){
           resolve(value)
           //success
        }else {
            //failure
        }
    })
    promise.then(function(value){
        //success
    },function(error){
        //failure
    })
}
//promise 对象的简单例子
function fn2(){
    function timeout(ms) {
        return new Promise((resolve,reject)=>{
            setInterval(resolve,ms,'done');
        })
    }
    timeout(3000).then((value) =>{
        console.log(value)
    })
}
//fn2()

//promise 新建后就会立即执行
function fn3(){
    let promise = new Promise(function(resolve,reject){
        console.log('promise')
        resolve();
    })
    promise.then(function(){
        console.log('resolved.')
    })
    console.log("Hi!")
}
//fn3()

// function loadImageAsync(url){
//     return new Promise(function(resolve,reject) {
//         const image = new Image();
//         image.onload = function(){
//             console.log("加载成功了")
//             console.log(image)
//             resolve(image)
//         };
//         image.onerror = function(){
//             reject(new Error('Could not load image at'+url))
//         };
//         image.src = url;
//     })
// }
//loadImageAsync('https://www.baidu.com/img/flexible/logo/pc/result.png')


/* 用一个promise对象实现的Ajax操作的例子 */

const getJSON = function(url){
    const promise = new Promise(function(resolve,reject){
        const hander = function(){
            if(this.readyState !==4){
                return;
            }
            if(this.status === 200){
                resolve(this.response);
            }else{
                reject(new Error(this.statusText))
            }
        }
        const client = new XMLHttpRequest();
        client.open("GET",url);
        client.onreadystatechange = hander;
        client.responseType = "json";
        client.setRequestHeader('Accept','application/json');
        client.send();
    });
    return promise
}
function getDetail(){
    getJSON('/posts.json').then(function(json){
        console.log("contents"+json)
    },function(error){
        console.error("出错了",error)
    })
}
/* 
    如果调用resolve函数和reject函数时带有参数，那么他们的参数会被传递给回调函数
    reject函数的参数通常是Error对象的实例，表示抛出的错误;
    resolve函数的参数除了正常值以外，还可能是另一个promise实例
*/
function getCallbackRes(){
    // const p1 = new Promise(function(resolve,reject){

    // })
    // const p2 = new Promise(function(resolve,reject){
    //     resolve(p1)
    // })
    
    const p1 = new Promise(function(resolve,reject){
        setTimeout(()=>reject(console.log("dada")),3000)
    })
    const p2 = new Promise(function(resolve,reject){
        setTimeout(()=>resolve(p1),1000)
    })
    p2.then(result =>console.log(result))
    .catch(error => 
        console.log(error)
    )

}
//getCallbackRes()

/* 
    promise.prototype.catch()
    用于指定发生错误时的回调函数。
*/
getJSON('/posts.json').then(function(posts){
    //...
}).catch(function(error){
    //处理 getJSON 和 前一个回调函数运行时发生的错误
    console.log("发生错误！",error)
})

/* 
finally()方法用于指定不管Promise对象最后状态如何，都会执行的操作，
*/
function promiseFinally(){
    promise
    .then(result =>{
        //...
    }).catch(error =>{
        //...
    }).finally(()=>{
        //...
    })
}